# -*- coding: utf-8 -*-
"""
多项式
Created on Sat Mar 31 16:05:26 2018

@author: Allen
"""
import numpy as np
import matplotlib.pyplot as plt

x = np.random.uniform( -3, 3, size = 100 )
X = x.reshape( -1, 1 )

y = 0.5 * x**2 + x + 2 + np.random.normal( 0, 1, size = 100 )
plt.scatter( x, y )
plt.show()

# 首先使用线性回归
from sklearn.linear_model import LinearRegression
lin_reg = LinearRegression()
lin_reg.fit( X, y )
y_predict = lin_reg.predict( X )

plt.scatter( x, y )
plt.plot( x, y_predict, color = "r" )
plt.show()
'''
可以看出是一条直线，一条直线拟合这些点显然是不准确的
'''
'''
解决方法：
    添加一个特征
'''
X2 = np.hstack( ( X, X**2 ) )
lin_reg2 = LinearRegression()
lin_reg2.fit( X2, y )
y_predict2 = lin_reg2.predict( X2 )

plt.scatter( x, y )
plt.plot( np.sort( x ), y_predict2[ np.argsort( x ) ], color = "r" )
plt.show()

print( lin_reg2.coef_ ) # [ 0.99673491  0.50925785]
print( lin_reg2.intercept_ ) # 1.98396646449
'''
可以看到，x的系数是0.9967，约等于1。x平方系数是0.5，基本符合公式
截距为 1.98，约等于2
'''


'''
多项式回归完全使用了线性回归的思想。
关键在于为原来的数据样本添加新的特征，而得到这些特征的方式是原有的特征多项式组合
使用这种方式可以解决一些非线性问题
'''
